<?php

/**
 * 适配器（转换器/变压器/包装器）模式（接口的转换）
 * 
 * 概述：将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作
 * 
 * 类型：结构型模式
 * 
 * 角色：
 *  1，目标角色。定义客户端使用的与特定领域相关的接口，这也就是我们所期待得到的
 *  2，源角色。需要进行适配的接口
 *  3，适配器角色。对Adaptee的接口与Target接口进行适配；适配器是本模式的核心，适配器把源接口转换成目标接口
 * 
 * 作用：
 * 类适配器：Adapter与Adaptee是继承关系
 * 1，用一个具体的Adapter类和Target进行匹配。结果是当我们想要一个匹配一个类以及所有它的子类时，类Adapter将不能胜任工作
 * 2，使得Adapter可以重定义Adaptee的部分行为，因为Adapter是Adaptee的一个子集
 * 3，仅仅引入一个对象，并不需要额外的指针以间接取得adaptee
 * 
 * 对象适配器：Adapter与Adaptee是委托关系
 * 1，允许一个Adapter与多个Adaptee同时工作。Adapter也可以一次给所有的Adaptee添加功能
 * 2，使用重定义Adaptee的行为比较困难
 * 
 * 其它：
 *  类适配器和对象适配器。
 */

/**
 * 目标角色（新接口）
 */
interface Target
{
	public function hello();
}

/**
 * 源角色（旧接口）
 */
class Adaptee
{
	public function greet()
	{
		echo 'greet 方法被调用。<br/>';
	}
}

/**
 * 类适配器
 */
class Adapter extends Adaptee implements Target
{
	public function hello()
	{
		parent::greet();
	}
}

class Client
{
	public static function main()
	{
		$adapter = new Adapter();
		echo '旧接口grret()调用：$adapter->greet()。<br/>';
		$adapter->greet();
		echo '新接口hello()调用：$adapter->hello()。<br/>';
		$adapter->hello();
	}
}

Client::main();